package com.xz.example.model;

/**
 * @author 张志航     
 * @version V1.0.0
 * @projectName design_mode
 * @title     LazySubgletion   
 * @package    com.xz.example.model  
 * @date   2019/12/3 15:26  
 * @explain 懒汉式
 */
public class LazySubgletion {

    // 使用volatile关键字保证多线程中都能正确处理(可以理解为被volatile修饰的属性直接属于主线程，通常说main的可见性)
    private volatile static  LazySubgletion instance = null;

    private LazySubgletion(){};

    /**
     * 注意需要保证线程安全，采用双重检查锁定的方式保证线程安全
     * @return
     */
    public static LazySubgletion getInstance(){
        // 第一重判断，当为null时进入
        if (instance == null){
            // 如果有一个线程进入，锁定，但是此时还没有创建instance，其它线程进入后会进行排队（有可能会创建多个）
            // 所以就需要有第二重判断，在进入synchronized代码块后再次判断是否为null，为null再创建
            synchronized (LazySubgletion.class){
                if (instance == null){
                    instance = new LazySubgletion();
                }
            }
        }
        return instance;
    }

}
